package rkdwogus7.basic;

public class J16_Calculator {

	public static void main(String[] args) {
		// 상속, 인터페이스, 기본클래스를 이용해서
		// 사칙연산을 수행하는 계산기 프로그램 작성
//		J16Add add = new J16Add();
//		add.setValue(3, 7);
//		System.out.println(add.toString());
//		System.out.println(add.calculate());
//		
//		J16Mul mul = new J16Mul();
//		mul.setValue(30, 70);
//		System.out.println(mul.toString());
//		System.out.println(mul.calculate());
		// +, x 연산을 위해 we create J16Add, J16Mul class objects.
		// but, in this case we also need to creat new objects
		// J16Sub, J16Div when we try to make -, / calculate.
		// we're gonna make useless objects in this way.
		// to solve this problem, we use upcasting instead of making objects
		// this is far more efficient way to save computer's memory.
		// 상속으로 잘 만들고 이렇게 사용하는것은 최악이라고 할 수 있지. 업캐스팅 / 다운캐스팅을 이용해서 사용해 보자.
		J16Cal c = new J16Add();
		c.setValue(10, 100);
		System.out.println(c.toString());
		System.out.println(c.calculate());
		
		c = new J16Mul();
		c.setValue(150, 25);
		System.out.println(c.toString());
		System.out.println(c.calculate());
		// we only make the parent object J16Cal to calculate +, x.
		// when we make another calculator later on, we can still use this parent object J16Cal
		// so we can solve the problem still easier.
		
		
		
	} // main

	
	
} // class

// 인터페이스
interface J16CalService {
	void setValue( int x, int y );
	int calculate(  );
}

// 클래스
class J16Cal implements J16CalService {
	private int x;
	private int y;
	
	public J16Cal() { }

	// 멤버변수 x, y의 초기화 작업은 setValue method로 대체하므로 생성자는 주석처리함
/*	public J16Cal(int x, int y) {
		this.x = x;
		this.y = y;
	}
*/
	
	public int getX() {
		return x;
	}

	public void setX(int x) {
		this.x = x;
	}

	public int getY() {
		return y;
	}

	public void setY(int y) {
		this.y = y;
	}

	@Override
	public String toString() {
		return "J16Cal [x=" + x + ", y=" + y + "]";
	}

	@Override
	public void setValue(int x, int y) {
		this.x = x;
		this.y = y;
	}

	@Override
	public int calculate() {
		return 0;
		
	}
	

}

class J16Add extends J16Cal {
	@Override
	public int calculate() {
		return getX() + getY();
	}

}

class J16Mul extends J16Cal {
	@Override
	public int calculate() {
		return getX() * getY();
	}
}






